from django.shortcuts import render

############生成用户绑定链接#####################

# 前端　当用户点击ＱＱ登录图标的时候，前端发送一个axios(Ajax)请求
#
# 后端　
#     请求
#     业务逻辑　调用ＱＱLoginTool 生成跳转链接
#     响应　返回跳转链接{"code":0,"qq_login_url":'http://xxx'}
#     路由　GET qq/authorization/
#     步骤
#         １．生成QQLoginTool实例对象
#         ２．调用对象方法生成跳转链接
#         ３．返回响应

from django.views import View
from QQLoginTool.QQtool import OAuthQQ
from meiduo_mall import settings
from django.http import JsonResponse

class QQLoginURLView(View):

    def get(self,request):
        next = request.GET.get('next')

        #生成ＱＱLoginTool实例对象
        # client_id = settings,
        # client_secret = None,
        # redirect_uri = None,
        # state = None
        qq = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                     client_secret=settings.QQ_CLIENT_SECRET,
                     redirect_uri=settings.QQ_REDIRECT_URI,
                     state=next
                     )

        #调用对象的方法生成跳转链接
        qq_login_url = qq.get_qq_url()


        #返回响应
        return JsonResponse({'code':0,'errmsg':'ok','login_url':qq_login_url})


'''
    需求：获取code，通过code换取token，再通过token换取换取openid

    前端

        应该获取用户同意登录的code，把这个code发送给后端

    后端

        请求：获取code

        业务逻辑：通过code换取token，再通过token换取换取openid
                根据openid进行判断，如果没有绑定过，则需绑定，如果绑定过，则直接登录

        响应
        路由  GET oauth_callback/?code=xxxx
        
        步骤
            
            １．获取code
            ２．通过code换取token
            ３．再通过token换取换取openid
            ４．根据openid进行判断
            ５．如果没有绑定过，则需绑定，
            ６．如果绑定过，则直接登录
'''



class OauthQQView(View):

    def get(self,request):
        # １．获取code
        code = request.GET.get('code')

        # 对code进行判断
        if code is None:
            return JsonResponse({'code':400,'errmsg':'参数不全'})

        # ２．通过code换取token
        qq = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                     client_secret=settings.QQ_CLIENT_SECRET,
                     redirect_uri=settings.QQ_REDIRECT_URI,
                     )
        token = qq.get_access_token(code)

        # ３．再通过token换取换取openid
        openid = qq.get_open_id(token)

        # ４．根据openid进行判断
        from apps.oauth.models import OAuthQQUser

        try:
            qquser = OAuthQQUser.objects.get(openid=openid)

        # ５．如果没有绑定过，则需绑定，
        except OAuthQQUser.DoesNotExist:
            # 加密数据
            from apps.oauth.utils import generic_openid
            access_token = generic_openid(openid)
            response = JsonResponse({'code':400,'access_token':access_token})
            return response

        # ６．如果绑定过，则直接登录
        else:
            # 设置session
            from django.contrib.auth import login
            login(request,qquser.user)
            # 设置cookie
            response = JsonResponse({'code':0,'errmsg':'ok'})
            response.set_cookie('username',qquser.user.username)

    def post(self, request):

        # １．接收请求
        import json
        data = json.loads(request.body.decode())

        # ２．获取请求参数
        mobile = data.get('mobile')
        password = data.get('password')
        sms_code = data.get('sms_code')
        access_token = data.get('access_token')


        # 添加对access_token的解密
        from apps.oauth.utils import check_access_token
        openid = check_access_token(access_token)
        if openid is None:
            return JsonResponse({'code':400,'errmag':'参数缺失'})

        # 校验参数
        # # 判断参数是否齐全
        # from django.http import JsonResponse
        # if not all([mobile, password, sms_code]):
        #     return JsonResponse({'code': 400,
        #                               'errmsg': '缺少必传参数'})
        #
        # # 判断手机号是否合法
        # import re
        # if not re.match(r'^1[3-9]\d{9}$', mobile):
        #     return JsonResponse({'code': 400,
        #                               'errmsg': '请输入正确的手机号码'})
        #
        # # 判断密码是否合格
        # if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
        #     return JsonResponse({'code': 400,
        #                               'errmsg': '请输入8-20位的密码'})
        #
        # # 3.判断短信验证码是否一致
        # # 创建 redis 链接对象:
        # from django_redis import get_redis_connection
        # redis_conn = get_redis_connection('code')
        #
        # # 从 redis 中获取 sms_code 值:
        # sms_code_server = redis_conn.get('sms_%s' % mobile)
        #
        # # 判断获取出来的有没有:
        # if sms_code_server is None:
        #     # 如果没有, 直接返回:
        #     return JsonResponse({'code': 400,
        #                               'errmsg': '验证码失效'})
        # # 如果有, 则进行判断:
        # if sms_code != sms_code_server.decode():
        #     # 如果不匹配, 则直接返回:
        #     return JsonResponse({'code': 400,
        #                               'errmsg': '输入的验证码有误'})
        #
        #     # 调用我们自定义的函数, 检验传入的 access_token 是否正确:
        # # 错误提示放在 sms_code_errmsg 位置
        # from.utils import check_access_token
        # openid = check_access_token(access_token)
        # if not openid:
        #     return JsonResponse({'code': 400,
        #                               'errmsg': '缺少openid'})
        # # 4.保存注册数据
        # from apps.users.models import User
        # try:
        #     user = User.objects.get(mobile=mobile)
        # except User.DoesNotExist:
        #     # 用户不存在,新建用户
        #     user = User.objects.create_user(username=mobile,
        #                                     password=password,
        #                                     mobile=mobile)
        # else:
        #     # 如果用户存在，检查用户密码
        #     if not user.check_password(password):
        #         return JsonResponse({'code': 400,
        #                                   'errmsg': '输入的密码不正确'})


        # ３．根据手机号进行用户信息的查询
        from apps.users.models import User
        from apps.oauth.models import OAuthQQUser
        try:
            user = User.objects.get(mobile=mobile)
        except User.DoesNotExist:
            # ５．查询到用户手机号没有注册，我们就创建一个user信息，然后在绑定
            user = User.objects.cerate_user(username=mobile,mobile=mobile,password=password)
        else:
            # ４．查询到用户手机号已经注册，判断密码是否正确，正确就可以直接保持（绑定）用户和openid信息
            if not user.check_password(password):
                return JsonResponse({'code':400,'errmsg':'账户或密码错误'})

        OAuthQQUser.objects.cerate(user=user,openid=openid)

        # 完成状态保持
        from django.contrib.auth import login
        login(request,user)

        # 返回响应
        response = JsonResponse({'code':0,'errmsg':'ok'})
        response.set_cookie('username',user.username)
        return response


'''
   
    需求：绑定美多账号和ＱＱ的openid点击保存按钮的时候，前端需要添加手机号，密码，短信验证码和openid　　必须提交openid
    
    前端：
        
        当用户输入手机号，密码，短信验证码之后就发送axios请求　请求需要携带mobile,password,sms_code,access_token(openid)
    
    后端：

        请求：接受请求，获取请求参数
        业务逻辑：绑定，完成状态保持
        响应：返回code=0跳转到首页
        路由：POST　oauth_callback/
        步骤：
            １．接收请求
            ２．获取请求参数
            ３．根据手机号进行用户信息的查询
            ４．查询到用户手机号已经注册，判断密码是否正确，正确就可以直接保持（绑定）用户和openid信息
            ５．查询到用户手机号没有注册，我们就创建一个user信息，然后在绑定

'''


###################itsdangerous的基本使用#######################
# 安装：pip install itsdangerous
#
# TimedJSONWebSignatureSerializer的使用
#
# 使用TimedJSONWebSignatureSerializer可以生成带有有效期的token

###加密############
# # １．导入itsdangerous的类
# from itsdangerous import TimedJSONWebSignatureSerializer as Serialzer
#
# # ２．创建类的实例对象
# # secret_key 秘钥
# # expire_in=None 过期时间（秒）
# from meiduo_mall import settings
# s = Serialzer(Secret_key=settings.SECRET_KEY,expires_in=3600)
#
# # ３．加密数据
# token = s.dumps({'openid':'1234567890'})
#
#
# ############解密数据########################
# # １．导入itsdangerous的类
# from itsdangerous import TimedJSONWebSignatureSerializer as Serialzer
#
# # ２．创建类的实例对象
# from meiduo_mall import settings
# s = Serialzer(settings.SECRET_KEY, expires_in=3600)
#
# # ３．解密数据
# s.loads(token)



